home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #44 (May 89) / Notification Source Code / HeyYou Source < prev    next >
Text File  |  1989-03-19  |  10KB  |  409 lines

  1. {     HeyYou program for MacTutor by Steve Sheets    }
  2. {        Demonstrates uses of the Notificaiton Manager.  Creates some simple String Notifications, some Sound    }
  3. {        Notifications, some Small Icon Notifications (imediately and after a delay).}
  4.  
  5.  
  6. program HeyYou;
  7.  
  8. {     Resource Constants.    }
  9.  
  10.     const
  11.         SICNdiamond = 0;
  12.  
  13.         SICNheyyou = 500;
  14.  
  15.         SNDbeep = 1;
  16.         SNDclick = 2;
  17.         SNDbong = 3;
  18.         SNDmonkey = 4;
  19.  
  20.         ALERTabout = 500;
  21.  
  22. {    Notification Manager Queue Record.    }
  23.  
  24.     type
  25.         NMRec = record
  26.                 qLink: QElemPtr;
  27.                 qType: INTEGER;
  28.                 nmFlags: INTEGER;
  29.                 nmPrivate: LONGINT;
  30.                 nmReserved: INTEGER;
  31.                 nmMark: INTEGER;
  32.                 nmSIcon: Handle;
  33.                 nmSound: Handle;
  34.                 nmStr: StringPtr;
  35.                 nmResp: ProcPtr;
  36.                 nmRefCon: LONGINT;
  37.             end;
  38.         NMPtr = ^NMRec;
  39.  
  40. {    Program Global Variables.  Menus, Notification Requests, Strings and Flags.    }
  41.  
  42.     var
  43.         myM1, myM2, myM3: MenuHandle;
  44.         StrRec, IconRec: NMRec;
  45.         StrStr, IconStr: Str255;
  46.         doneFlag, IconFlag: BOOLEAN;
  47.         Timer: LONGINT;
  48.  
  49. {    Notification Manager Glue rotines.    }
  50.  
  51. {    Install Notifiaction Request into Queue.    }
  52.  
  53.     function NMInstall (nmReqPtr: QElemPtr): OSErr;
  54.     inline
  55.         $205F, $A05E, $3E80;
  56. {    MOVE.L    (SP)+,A0        }
  57. {    _NMInstall                }
  58. {    MOVE.W    D0,(SP)        }
  59.  
  60. {    Remove Notifiaction Request into Queue.    }
  61.  
  62.     function NMRemove (nmReqPtr: QElemPtr): OSErr;
  63.     inline
  64.         $205F, $A05F, $3E80;
  65. {    MOVE.L    (SP)+,A0        }
  66. {    _NMRemove                }
  67. {    MOVE.W    D0,(SP)        }
  68.  
  69. {    Checks to see if this is System 6.0 or above.    }
  70.  
  71.     function CheckSystem: Boolean;
  72.         var
  73.             theWorld: SysEnvRec;
  74.     begin
  75.         if SysEnvirons(1, theWorld) = noErr then
  76.             CheckSystem := (theWorld.systemVersion >= $0600)
  77.         else
  78.             CheckSystem := FALSE;
  79.     end;
  80.  
  81. {    Display About Info.    }
  82.  
  83.     procedure DoAbout;
  84.         var
  85.             dummy: INTEGER;
  86.     begin
  87.         dummy := Alert(ALERTabout, nil);
  88.     end;
  89.  
  90. {    First Test of Notification Manager.    }
  91. {        Displays a simple String.  The Notification Request is automatically    removed after it is completed.    }
  92.  
  93.     procedure NotifStr (St: Str255);
  94.         var
  95.             E: OSerr;
  96.     begin
  97.         with StrRec do
  98.             begin
  99.                 qType := 8;
  100. {    No Mark, Icons or Sounds.    }
  101.                 nmMark := 0;
  102.                 nmSIcon := nil;
  103.                 nmSound := nil;
  104. {    This String.    }
  105.                 StrStr := St;
  106.                 nmStr := @StrStr;
  107. {    Automatically Removed when Completed.    }
  108.                 nmResp := POINTER(-1);
  109.                 nmRefCon := 0;
  110.             end;
  111.  
  112.         E := NMInstall(@StrRec);
  113.     end;
  114.  
  115. {    Call by Notification Manager after a Sound Notification has been completed.  Removes        }
  116. {        the entry from Notification queue, releases SND resource if there is one, disposes of    }
  117. {        string handle if there is one and disposes of the request record.    }
  118.  
  119.     procedure MySndResponse (nmReqPtr: QElemPtr);
  120.         var
  121.             aPtr: NMPtr;
  122.             E: OSErr;
  123.     begin
  124.         aPtr := NMPtr(nmReqPtr);
  125.         E := NMRemove(nmReqPtr);
  126.         if (aPtr^.nmSound <> nil) and (aPtr^.nmSound <> POINTER(-1)) then
  127.             ReleaseResource(aPtr^.nmSound);
  128.         if aPtr^.nmRefCon <> 0 then
  129.             begin
  130.                 HUnLock(Handle(aPtr^.nmRefCon));
  131.                 DisposHandle(Handle(aPtr^.nmRefCon));
  132.             end;
  133.         DisposPtr(Ptr(nmReqPtr));
  134.     end;
  135.  
  136. {    Second Test of Notification Manager.    }
  137. {        Displays a String and plays a sound.  Allocates memmory for the request record and the string.    }
  138. {        If Sound is -1, the System Beep is used.  Any other number,  indicates a SND resource, and    }
  139. {        that resource is loaded in.  MySndResponse is setup so that it will be called after the Notification is completed.    }
  140.  
  141.     procedure NotifSnd (St: Str255; Sn: INTEGER);
  142.         var
  143.             E: OSerr;
  144.             tempRec: NMPtr;
  145.             StrHdl: StringHandle;
  146.     begin
  147.         tempRec := NMPtr(NewPtr(SIZEOF(NMRec)));
  148.         with tempRec^ do
  149.             begin
  150.                 qType := 8;
  151. {    No Marks or Icons.    }
  152.                 nmMark := 0;
  153.                 nmSIcon := nil;
  154. {    System Beep or SND resource.    }
  155.                 if (Sn = -1) then
  156.                     nmSound := POINTER(-1)
  157.                 else
  158.                     nmSound := GetResource('snd ', Sn);
  159. {    If String, allocate memmory for it.    }
  160.                 if St = '' then
  161.                     begin
  162.                         nmStr := nil;
  163.                         nmRefCon := 0;
  164.                     end
  165.                 else
  166.                     begin
  167.                         StrHdl := NewString(St);
  168.                         HLock(Handle(StrHdl));
  169.                         nmRefCon := ORD4(StrHdl);
  170.                         nmStr := StrHdl^;
  171.                     end;
  172. {    Call MySndResponse to remove resource when completed. }
  173.                 nmResp := @MySndResponse;
  174.             end;
  175.  
  176.         E := NMInstall(QElemPtr(tempRec));
  177.     end;
  178.  
  179. {    Third Test of Notification Manager.    }
  180. {        Displays a String, displays a Small Icon and Marks the Current Application.    }
  181. {        This Notification is not removed until the User selects "Remove Icon"    }
  182. {        fromt the Menu or the Application is Quit. }
  183.  
  184.     procedure NotifIcon (St: Str255; IC: INTEGER);
  185.         var
  186.             E: OSerr;
  187.     begin
  188.         if not IconFlag then
  189.             begin
  190.                 IconFlag := TRUE;
  191.                 with IconRec do
  192.                     begin
  193.                         qType := 8;
  194. {    Current Application is Marked (in MultiFinder).    }
  195.                         nmMark := 1;
  196. {    Small Icon is used.    }
  197.                         nmSIcon := GetResource('SICN', IC);
  198. {    No SND.    }
  199.                         nmSound := nil;
  200. {    This String.    }
  201. {    Use String (if any).    }
  202.                         if St = '' then
  203.                             nmStr := nil
  204.                         else
  205.                             begin
  206.                                 IconStr := St;
  207.                                 nmStr := @IconStr;
  208.                             end;
  209. {    No Completion Routine.    }
  210.                         nmResp := nil;
  211.                         nmRefCon := 0;
  212.                     end;
  213.  
  214.                 E := NMInstall(@IconRec);
  215.             end;
  216.     end;
  217.  
  218. {    If an small Icon is still flashing, Removes it and releases SND resource.    }
  219.  
  220.     procedure RemoveNotifIcon;
  221.         var
  222.             E: OSerr;
  223.     begin
  224.         if IconFlag then
  225.             begin
  226.                 IconFlag := FALSE;
  227.                 E := NMRemove(@IconRec);
  228.                 if IconRec.nmSIcon <> nil then
  229.                     ReleaseResource(IconRec.nmSIcon);
  230.             end;
  231.     end;
  232.  
  233. {    Normal Mac Setup Procedure    }
  234.  
  235.     procedure SetUp;
  236.         var
  237.             S: Str255;
  238.     begin
  239.         doneFlag := FALSE;
  240.         IconFlag := FALSE;
  241.         Timer := 0;
  242.  
  243.         S := '1';
  244.         S[1] := CHR(applemark);
  245.         myM1 := NewMenu(101, S);
  246.         AppendMenu(myM1, 'NotifTest Source;(-');
  247.         AddResMenu(myM1, 'DRVR');
  248.         InsertMenu(myM1, 0);
  249.         myM2 := NewMenu(102, 'File');
  250.         AppendMenu(myM2, 'Quit');
  251.         InsertMenu(myM2, 0);
  252.         myM3 := NewMenu(103, 'Simple');
  253.         AppendMenu(myM3, 'String Test #1;String Test #2;(-;Bong Sound Test;Click Sound Test;Bong and Click Sound Test');
  254.         AppendMenu(myM3, 'Monkey Sound Alone Test - no alert;System Error Sound Test;(-;Diamond Icon Test');
  255.         AppendMenu(myM3, 'HeyYou Icon Alone Test - no alert;Delayed Icon Test;Remove Icon');
  256.         InsertMenu(myM3, 0);
  257.         DrawMenuBar;
  258.     end;
  259.  
  260. {    Normal Mac Menu Command Routine.    }
  261.  
  262.     procedure DoCommand (mResult: LONGINT);
  263.         var
  264.             theItem: INTEGER;
  265.             theMenu: INTEGER;
  266.             tempStr: Str255;
  267.             tempInteger: INTEGER;
  268.             tempLong: LONGINT;
  269.     begin
  270.         theItem := LoWord(mResult);
  271.         theMenu := HiWord(mResult);
  272.  
  273.         case theMenu of
  274.             101: 
  275.                 if theItem = 1 then
  276.                     DoAbout
  277.                 else
  278.                     begin
  279.                         GetItem(myM1, theItem, tempStr);
  280.                         tempInteger := OpenDeskAcc(tempStr);
  281.                     end;
  282.  
  283.             102: 
  284.                 if theItem = 1 then
  285.                     doneFlag := TRUE;
  286.  
  287.             103: 
  288.                 case theItem of
  289.                     1: 
  290.                         NotifStr('This is a String Test of the Notification Manager.');
  291.                     2: 
  292.                         begin
  293.                             GetDateTime(tempLong);
  294.                             IUTimeString(tempLong, TRUE, tempStr);
  295.                             tempStr := CONCAT('This is another String Test of the Notification Manager.  The Time is ', tempStr);
  296.                             NotifStr(tempStr);
  297.                         end;
  298.  
  299.                     4: 
  300.                         NotifSnd('This is a Sound Test of the Notification Manager using the Bong sound.', SNDbong);
  301.                     5: 
  302.                         NotifSnd('This is a Sound Test of the Notification Manager using the Click sound.', SNDclick);
  303.                     6: 
  304.                         begin
  305.                             NotifSnd('This is a Sound Test of the Notification Manager using the Bong sound.', SNDbong);
  306.                             NotifSnd('This is a Sound Test of the Notification Manager using the Click sound.', SNDclick);
  307.                         end;
  308.                     7: 
  309.                         NotifSnd('', SNDmonkey);
  310.                     8: 
  311.                         NotifSnd('This is a Sound Test of the Notification Manager using the System Error sound.', -1);
  312.  
  313.                     10: 
  314.                         begin
  315.                             RemoveNotifIcon;
  316.                             NotifIcon('This is a Icon Test of the Notification Manager using the Diamond Icon.', SICNdiamond);
  317.                         end;
  318.                     11: 
  319.                         begin
  320.                             RemoveNotifIcon;
  321.                             NotifIcon('', SICNheyyou);
  322.                         end;
  323. {    Call NotifIcon after 60 seconds (3600 ticks).    }
  324.                     12: 
  325.                         Timer := TickCount + 3600;
  326.                     13: 
  327.                         RemoveNotifIcon;
  328.                     otherwise
  329.                 end;
  330.             otherwise
  331.         end;
  332.         HiliteMenu(0);
  333.     end;
  334.  
  335. {    Simple Mac Main Event Loop.  Check to see if it is time to display HeyYou Icon.    }
  336. {        If Resuming under MultiFinder, Remove Icon (if any).        }
  337.  
  338.     procedure MainLoop;
  339.         const
  340.             suspendResumeMessage = 1;
  341.         var
  342.             myEvent: EventRecord;
  343.             whichWindow: WindowPtr;
  344.             tempStr: Str255;
  345.             tempLong: LONGINT;
  346.     begin
  347.         repeat
  348.  
  349.             if Timer <> 0 then
  350.                 if TickCount > Timer then
  351.                     begin
  352.                         RemoveNotifIcon;
  353.                         Timer := 0;
  354.                         GetDateTime(tempLong);
  355.                         IUTimeString(tempLong, TRUE, tempStr);
  356.                         NotifIcon(CONCAT('Hey You!  The Time is ', tempStr), SICNheyyou);
  357.                     end;
  358.  
  359.             if WaitNextEvent(everyEvent, myEvent, 0, nil) then
  360.                 case myEvent.what of
  361.                     mouseDown: 
  362.                         case FindWindow(myEvent.where, whichWindow) of
  363.                             inSysWindow: 
  364.                                 SystemClick(myEvent, whichWindow);
  365.                             inMenuBar: 
  366.                                 DoCommand(MenuSelect(myEvent.where));
  367.                             otherwise
  368.                         end;
  369.                     App4Evt: 
  370.                         if BitShift(myEvent.message, -24) = SuspendResumeMessage then
  371.                             if Odd(myEvent.message) then
  372.                                 RemoveNotifIcon;
  373.                     otherwise
  374.                 end;
  375.         until doneFlag;
  376.     end;
  377.  
  378. {    Deletes Menus and removes Icon Notification Request (if any).    }
  379.  
  380.     procedure CloseDown;
  381.     begin
  382.         RemoveNotifIcon;
  383.         DeleteMenu(101);
  384.         DeleteMenu(102);
  385.         DeleteMenu(103);
  386.         DisposeMenu(myM1);
  387.         DisposeMenu(myM2);
  388.         DisposeMenu(myM3);
  389.     end;
  390.  
  391. {    Main Program    .    }
  392.  
  393. begin
  394.     InitGraf(@thePort);
  395.     InitFonts;
  396.     FlushEvents(everyEvent, 0);
  397.     InitWindows;
  398.     InitMenus;
  399.     TEInit;
  400.     InitDialogs(nil);
  401.     InitCursor;
  402.     DoAbout;
  403.     if CheckSystem then
  404.         begin
  405.             SetUp;
  406.             MainLoop;
  407.             CloseDown;
  408.         end;
  409. end.